<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>模拟new的实现</title>
</head>

<body>

</body>

</html>

<script>
  function Animal(type) {
    this.type = type; // 实例上的属性
    // 如果当前构造函数返回的是一个引用类型，需要将这个引用类型返回
    return { name: '小笑残虹' }
  }

  Animal.prototype.say = function () {
    console.log('say');
  }

  // 知识点：原型链、继承

  // 模拟实现 new 关键字
  function mockNew() {
    // Constructor => Animal, 剩余的arguments就是其他的参数
    let Constructor = [].shift.call(arguments);
    let obj = {}; // 返回的结果
    obj.__proto__ = Constructor.prototype; // 继承原型对象上的方法
    let r = Constructor.apply(obj, arguments); // 继承原型对象上的属性
    return r instanceof Object ? r : obj;
  }

  let animal = mockNew(Animal, '哺乳类');
  // console.log(animal.type);
  // animal.say();
  console.log(animal);




</script>